home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / lsdoor09.zip / SERIAL.CPP < prev    next >
C/C++ Source or Header  |  1996-04-26  |  3KB  |  134 lines

  1. // LightSpeed Standard - Serial functions - Standard v1.0
  2.  
  3. #include "lib.h"
  4.  
  5. #define global extern
  6. #include "fos.h"
  7. #include "lite.h"
  8. #include "util.h"
  9. #include "dispf.h"
  10. #undef global
  11.  
  12. #define global
  13. #include "serial.h"
  14. #undef global
  15.  
  16. truth timed_in( uchar c ){
  17.   uint seconds = lsTimeout;
  18.   while( seconds-- ){
  19.     while( direct_ready() )
  20.       if( (uchar)direct_in() == (uchar)c ) return true;
  21.     dvsleep(1);
  22.   }
  23.   return false;
  24. }
  25.  
  26. int timed_get( void ){
  27.   uint seconds = lsTimeout;
  28.   while( seconds-- ){
  29.     if( direct_ready() ) return direct_in();
  30.     if( !carrier() ) break;
  31.     dvsleep(1);
  32.   }
  33.   return -1;
  34. }
  35.  
  36. truth confirm_in( uchar c ){
  37.   uint seconds = lsTimeout;
  38.   while( seconds-- ){
  39.     if( direct_ready() ){
  40.       if( direct_in() == c && timed_get() == c ){
  41.     direct_out(c); if( timed_get() == '!' ) return true;
  42.       }
  43.     }
  44.     if( !carrier() ) break;
  45.     dvsleep(1);
  46.   }
  47.   return false;
  48. }
  49.  
  50. int confirm_get( void ){
  51.   uint seconds = lsTimeout;
  52.   while( seconds-- ){
  53.     if( direct_ready() ){
  54.       int c = direct_in();
  55.       if( timed_get() == c ){
  56.     direct_out(c); if( timed_get() == '!' ) return c;
  57.       }
  58.     }
  59.     if( !carrier() ) break;
  60.     dvsleep(1);
  61.   }
  62.   return -1;
  63. }
  64.  
  65. truth confirm_out( uchar c ){
  66.   direct_out( c ); direct_out(c);
  67.   if( timed_in(c) ){ direct_out('!'); return true; }
  68.   return false;
  69. }
  70.  
  71.  
  72. void direct_write( void *dat, uint len )
  73. {
  74.   uchar *ss = (uchar *)dat;
  75.   while( len-- ){
  76.     direct_out( *ss );
  77.     ss++;
  78.   }
  79. }
  80.  
  81. int direct_read( void *dat, uint len )
  82. {
  83.   uchar *ss = (uchar *)dat; int ii, jj; uint cntlen=0;
  84.   while( len-- ){
  85.     ii = timed_get();
  86.     if( ii == -1 ) return cntlen;
  87.     *ss = ii; ss++; cntlen++;
  88.   }
  89.   return cntlen;
  90. }
  91.  
  92.  
  93. int confirm_write( void *dat, uchar len )
  94. {
  95.   uchar *ss, cnt, retries=0; ulong chksum, insum;
  96.   while( carrier() && retries++ < 10 ){
  97.     if( !confirm_out( len ) ) return 0;
  98.     ss = (uchar *)dat; chksum = 0; cnt = 0;
  99.     while( cnt < len ){
  100.       direct_out( *ss ); chksum += *ss; ss++; cnt++;
  101.     }
  102.     insum = 0;
  103.     direct_read( &insum, sizeof(ulong) );
  104.     if( chksum == insum && confirm_out('+') ) break;
  105.     confirm_out('-');
  106.     cnt = 0;
  107.   }
  108.   return cnt;
  109. }
  110.  
  111. int confirm_read( void *dat, uchar len )
  112. {
  113.   uchar *ss, cnt, retries=0; ulong chksum; int ii, jj, kk, fails=0;
  114.   while( carrier() && fails < 2 && retries++ < 10 ){
  115.     ii = confirm_get();
  116.     if( ii == -1 ){ fails++; continue; }
  117.     if( ii > len ) return 0;
  118.     ss = (uchar *)dat; chksum = 0; cnt = 0;
  119.     while( cnt < ii ){
  120.       jj = timed_get();
  121.       if( jj == -1 ){ cnt=0; fails++; continue; }
  122.       *ss = (uchar)jj; chksum += *ss; ss++; cnt++;
  123.     }
  124.     direct_write( &chksum, sizeof(ulong) );
  125.     if( confirm_get() == '+' ) break;
  126.     cnt = 0;
  127.   }
  128.   return cnt;
  129. }
  130.  
  131.  
  132. // End of Serial.Cpp
  133.  
  134.